#!/usr/local/bin/bash

set -e

LANG=C LC_COLLATE=C LC_CTYPE=C LC_MESSAGES=C LC_MONETARY=C LC_NUMERIC=C LC_TIME=C LC_ALL=C
export LANG LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME LC_ALL

## bash 3 does not work for this code
#if [ -z "$IN_DASH" ]; then
#    if command -v dash >/dev/null; then
#        export IN_DASH=1
#        exec dash "$0" "$@"
#    else
#        echo >&2 "please install dash from homebrew or macports to run this script"
#        exit 1
#    fi
#fi

target_bits=64
target_cpu=x86_64

case "$1" in
    -64)
        shift
        ;;
    -32)
        target_bits=32
        target_cpu=i386
        shift
        ;;
    -arm64)
        target_bits=arm64
        target_cpu=arm64
        shift
        ;;
esac

# Need to use Xcode 9 for 32 bit builds on Mojave and newer.
# Place it in /Applications/Xcode9.app .
if [ "$target_bits" -eq 32 ] && [ -d /Applications/Xcode9.app ]; then
    PREV_XCODE=$(xcode-select -p)
    printf "\nSetting Xcode9 as the default Xcode for 32 bit build...\n\n"
    sudo xcode-select -s /Applications/Xcode9.app/Contents/Developer
fi

# Unlink brew wxwidgets if installed because it interferes with ours.
brew unlink wxwidgets >/dev/null 2>&1

export BUILD_ROOT="$HOME/vbam-build-mac-${target_bits}bit"

BUILD_ENV=$(cat <<EOF
export MACOSX_DEPLOYMENT_TARGET=10.7
export COMMAND_MODE=unix2003
export CC=clang
export CXX=clang++
export CPPFLAGS="-DICONV_CONST="
export CFLAGS="-m${target_bits} -framework Carbon -framework Foundation -framework CoreServices -stdlib=libc++ -Wno-unused-command-line-argument -DICONV_CONST= -Wl,-no_compact_unwind"
export CXXFLAGS="-m${target_bits} -stdlib=libc++ -framework Carbon -framework Foundation -framework CoreServices -Wno-unused-command-line-argument -DICONV_CONST= -Wl,-no_compact_unwind"
export OBJCXXFLAGS="-m${target_bits} -stdlib=libc++ -framework Carbon -framework Foundation -framework CoreServices -Wno-unused-command-line-argument -DICONV_CONST= -Wl,-no_compact_unwind"
export LDFLAGS="-m${target_bits} -framework Carbon -framework Foundation -framework CoreServices -stdlib=libc++ -Wno-unused-command-line-argument -Wl,-no_compact_unwind"

export UUID_CFLAGS="-I\$BUILD_ROOT/root/stow/libuuid/include"
export UUID_LIBS="-L\$BUILD_ROOT/root/stow/libuuid/lib -luuid"
EOF
)

export BUILD_ENV
export TAR=tar

if [ "$target_cpu" = i386 ]; then
    export CONFIGURE_REQUIRED_ARGS='--host=i386-apple-darwin --build=x86_64-apple-darwin'
fi

. "$(dirname "$0")/../builder/core.sh"

for dist in flex libsecret c2man graphviz zip; do
    table_line_remove DISTS "$dist"
done

# issues with perl modules linked to our libs and brew perl
table_line_remove DISTS shared-mime-info

table_line_replace DIST_PREFIX libuuid /usr/stow/libuuid

table_line_append DIST_PRE_BUILD zip " \
    sed -i.bak 's/-DZMEM//g; s/-DNO_DIR//g;' unix/configure \
"

if [ "$target_cpu" = i386 ]; then
    table_line_replace DIST_CONFIGURE_OVERRIDES openssl './Configure darwin-i386-cc no-shared --prefix=/usr --openssldir=/etc/ssl'
else
    table_line_replace DIST_CONFIGURE_OVERRIDES openssl './Configure darwin64-x86_64-cc no-shared --prefix=/usr --openssldir=/etc/ssl'
fi

table_line_append DIST_EXTRA_CFLAGS libogg    "-include \"$(xcode-select -p)\"/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/stdint.h"

table_line_append DIST_EXTRA_CFLAGS libvorbis "-include \"$(xcode-select -p)\"/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/stdint.h"

table_line_append DIST_EXTRA_CFLAGS libtheora "-include \"$(xcode-select -p)\"/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/stdint.h"

table_line_append DIST_EXTRA_CFLAGS ffmpeg "-include \"$(xcode-select -p)\"/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/stdint.h"

# -Wl,-no_compact_unwind must be passed in LDFLAGS to openssl
table_line_append DIST_MAKE_ARGS openssl "LDFLAGS=\"\$LDFLAGS\""

# these are only applicable for cross-compiling to 32 bits
if [ "$target_cpu" = i386 ]; then
    # some dists will not cross compile without a CONFIG_SITE
    table_line_append DIST_ARGS pkgconfig '--host= --build='
    table_line_append DIST_ARGS docbook2x '--host= --build='

    # python does not support cross-compiling to 32bits
    table_line_append DIST_ARGS python2 '--host= --build='
    table_line_append DIST_ARGS python3 '--host= --build='

    table_line_append DIST_ARGS sfml '-DCMAKE_OSX_ARCHITECTURES=i386'

    table_line_append DIST_PRE_BUILD sfml " \
        sed -i.bak '/FATAL_ERROR \"Only 64-bit architecture is supported/d' CMakeLists.txt; \
    "

    table_line_append DIST_ARGS libicu '--host= --build='
fi

table_line_replace DIST_CONFIGURE_TYPES libmodplug autoreconf
table_line_append  DIST_PRE_BUILD       libmodplug " \
    sed -i.bak '/-mmacosx-version-min=/d' configure.ac; \
    sed -i.bak 's/-lstdc++/-lc++/g' libmodplug.pc.in; \
"

table_line_append DIST_PRE_BUILD libzmq "sed -i.bak 's/-lstdc++/-lc++/g' src/libzmq.pc.in"
table_line_append DIST_PRE_BUILD ffmpeg "sed -i.bak 's/-lstdc++/-lc++/g' configure"

table_line_replace DISTS wxwidgets "https://github.com/wxWidgets/wxWidgets/releases/download/v3.0.5.1/wxWidgets-3.0.5.1.tar.bz2 lib/libwx_baseu-3.0*.a"

table_line_append DIST_CONFIGURE_OVERRIDES wxwidgets  "--with-macosx-version-min=\$MACOSX_DEPLOYMENT_TARGET LDFLAGS=\"\$LDFLAGS -stdlib=libc++\" --disable-stl"

table_line_append DIST_ARGS libmodplug "CC=clang++ CXX=clang++"

table_line_append DIST_PRE_BUILD libvpx " \
    sed -E -i.bak 's/(-mmacosx-version-min=)[[:digit:].]+/\1'\$MACOSX_DEPLOYMENT_TARGET'/g' build/make/configure.sh; \
"

table_line_append DIST_CONFIGURE_OVERRIDES ffmpeg "--disable-videotoolbox --extra-ldflags='-framework CoreText'"

table_line_append DIST_PATCHES ffmpeg "-p0 https://gist.githubusercontent.com/rkitover/db75d083b74617b186eec11965c1da74/raw/20da2f8c6d8c02ce284096c5e805ae671351cc6e/ffmpeg-macos10-7.patch"

builder "$@"

if [ -n "$PREV_XCODE" ]; then
    printf "\nRe-setting '$PREV_XCODE' as the default Xcode...\n\n"
    sudo xcode-select -s "$PREV_XCODE"
fi

# Link brew wxwidgets back if installed.
brew link wxwidgets >/dev/null 2>&1
